package com.example.filter;

import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.stereotype.Component;

import java.util.Arrays;
import java.util.List;

/**
 * @Author 刘武贵
 * @Date 2024-03-05 22:49
 * @Description 功能描述：自定义过滤器模拟实现灰度发布
 */
@Component
/**
 * 该类扩展了AbstractGatewayFilterFactory，用于创建GrayscaleGatewayFilter实例。
 * 它提供了灰度发布的网关过滤器功能。
 */
public class GrayscaleGatewayFilterFactory extends AbstractGatewayFilterFactory<GrayscaleGatewayFilterConfig> {

    /**
     * GrayscaleGatewayFilterFactory类构造函数
     *
     * 该构造函数初始化了GrayscaleGatewayFilterFactory，继承自GatewayFilterFactory，并指定GrayscaleGatewayFilterConfig作为配置类。
     */
    public GrayscaleGatewayFilterFactory(){
        super(GrayscaleGatewayFilterConfig.class);
    }

    /**
     * 根据给定的GrayscaleGatewayFilterConfig配置，创建并返回一个GatewayFilter实例。
     *
     * @param config GrayscaleGatewayFilterConfig配置对象，用于配置灰度发布相关的参数。
     * @return 返回一个GatewayFilter实例，该实例在请求通过时，根据配置决定是否进行灰度发布处理。
     */
    @Override
    public GatewayFilter apply(GrayscaleGatewayFilterConfig config) {
        // 根据配置决定是否输出灰度发布的提示信息，并继续处理请求链。
        return (exchange, chain) -> {
            if (config.isGrayscale()){
                System.out.println("开启了灰度发布功能...");
            }else{
                System.out.println("关闭了灰度发布功能...");
            }
            return chain.filter(exchange);
        };
    }

    /**
     * 提供快捷方式字段的顺序列表。
     * 该方法重写了父类中的shortcutFieldOrder方法，定义了快捷方式字段的显示顺序。
     *
     * @return List<String> 返回一个包含字段名称的字符串列表。在这个例子中，返回的列表只包含一个元素 "grayscale"。
     */
    @Override
    public List<String> shortcutFieldOrder() {
        // 返回一个包含字段"grayscale"的列表
        return Arrays.asList("grayscale");
    }
}
